Binary executable
Plik binarny wykonywalny (ang. binary executable) to plik zawierający bezpośrednio maszynowy kod programu, który może zostać uruchomiony przez system operacyjny po załadowaniu do pamięci procesora. W odróżnieniu od skryptów tekstowych, binarne pliki wykonywalne nie wymagają interpretacji przez interpreter – system operacyjny przekazuje je procesorowi do natychmiastowego wykonania.
Budowa i struktura
Typowy plik wykonywalny składa się z następujących sekcji:
- Nagłówek – opisuje format pliku, architekturę procesora (x86, ARM itp.) oraz pozycje kolejnych segmentów.
- Segmenty kodu (text) – zawierają skompilowany kod maszynowy.
- Segmenty danych (data, bss) – przechowują zmienne statyczne i nieinicjalizowane.
- Tablice symboli – informacje potrzebne przy linkowaniu i debugowaniu.
- Tablice relokacji – opisują miejsca, które muszą zostać zmodyfikowane podczas ładowania.
- Informacje o zasobach – np. obrazy, ikony, informacje o wersji.
Popularne formaty plików wykonywalnych
W zależności od platformy i systemu operacyjnego używa się różnych formatów:
- ELF (Executable and Linkable Format) – dominujący w systemach Unix-opartych, w tym Linux.
- PE (Portable Executable) – wykorzystywany w Windows.
- Mach-O – format stosowany w macOS oraz iOS.
Proces powstawania pliku binarnego
Tworzenie pliku wykonywalnego obejmuje kilka etapów:
- Kompilacja – kompilator zamienia kod źródłowy (np. w językach C, C++, Rust) na kod maszynowy w postaci plików obiektowych.
- Linkowanie – linker łączy wiele plików obiektowych oraz biblioteki (static lub dynamic) w jedną całość, tworząc finalny plik binarny.
- Optymalizacja – narzędzia takie jak optymalizator (np.
strip) mogą usuwać niepotrzebne informacje, zmniejszając rozmiar.
Ładowanie i uruchamianie
Po wywołaniu pliku wykonywalnego system operacyjny wykonuje następujące czynności:
- Odczytuje nagłówek i sprawdza zgodność formatu oraz wymaganą architekturę.
- Ładuje segmenty kodu i danych do pamięci wirtualnej procesu.
- Rozwiązuje relokacje i wiązania dynamiczne (np. podlinkowanie bibliotek DLL w Windows lub .so w Linux).
- Ustawia wskaźnik instrukcji (IP/EIP/RIP) na punkt startowy (zazwyczaj funkcję
main). - Rozpoczyna wykonanie kodu na procesorze.
Bezpieczeństwo i ochrona
Pliki binarne są często celem ataków, dlatego wprowadzono szereg mechanizmów ochronnych:
- ASLR (Address Space Layout Randomization) – losowe rozmieszczanie segmentów w pamięci.
- DEP/NX (Data Execution Prevention) – oznaczanie stron pamięci jako nie‑wykonywalne.
- Podpisy cyfrowe – weryfikacja integralności i autentyczności pliku (np. Code Signing).
- Kontrola dostępu – systemy uprawnień ograniczające możliwość uruchamiania nieznanych binariów.
W kontekście bezpieczeństwa komputerowego analiza plików binarnych często wykorzystuje techniki reverse engineering oraz narzędzia takie jak disassembler i debugger.
Narzędzia i środowiska
Do pracy z plikami binarnymi wykorzystywane są m.in.:
- GCC, Clang – kompilatory generujące pliki ELF, PE lub Mach-O.
- LD, LNK – linkery.
- objdump, readelf – narzędzia do analizy struktury binarnej.
- GDB, LLDB – debugery.
- Radare2, Binary Ninja, IDA Pro – platformy do inżynierii wstecznej.
Historia
Pierwsze binarne pliki wykonywalne pojawiły się w latach 1970 w systemach mainframe, gdzie programy były ładowane bezpośrednio z taśm magnetycznych. W miarę rozwoju systemów operacyjnych powstały bardziej złożone formaty, takie jak COFF w systemie UNIX System V oraz wspomniane ELF (wprowadzone w 1990 roku). W świecie Windows format PE zadebiutował wraz z Windows NT w połowie lat 1990.